import { Note } from 'src/note/entities/note.entity'
import { Subject } from 'src/subject/entities/subject.entity'
import { Todolist } from 'src/todolist/entities/todolist.entity'
import { Column, CreateDateColumn, Entity, JoinTable, ManyToMany, OneToMany, PrimaryGeneratedColumn } from 'typeorm'

// Entity：将一个类标记为数据库实体，TypeORM 会根据该类的定义创建对应的数据库表。
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  _id: number

  @Column('varchar', { unique: true })
  phone: string

  @Column('varchar')
  password: string

  @Column('varchar')
  role: string

  @Column({ default: false })
  has_person_info: boolean

  @Column({ type: 'varchar', default: '/uploads/avatar/file-1706500243146-914733427.jpg' })
  avatar: string

  @CreateDateColumn()
  created: Date

  @Column({ type: 'varchar', nullable: true })
  edu: string

  @Column({ type: 'varchar', nullable: true })
  graduation_time: string

  // @Column({ type: 'varchar', nullable: true })
  // money: string

  @Column({ type: 'varchar', nullable: true })
  name: string

  @Column({ type: 'varchar', nullable: true })
  techStack: string

  @Column({ type: 'varchar', nullable: true })
  vChat: string

  // () => Subject 表示关联的目标实体是 Subject 类，subject => subject.user 表示在 Subject 实体中通过 user 属性来关联 User 实体。
  @ManyToMany(() => Subject, subject => subject.user, {
    // cascade: true：表示在保存、更新或删除 User 实体时，会级联操作关联的 Subject 实体。
    cascade: true,
    // onUpdate: 'CASCADE'：表示当 User 实体的主键更新时，关联的 Subject 实体也会级联更新。
    onUpdate: 'CASCADE',
    // onDelete: 'CASCADE'：表示当删除 User 实体时，关联的 Subject 实体也会级联删除。
    onDelete: 'CASCADE'
  })
  // JoinTable：用于在多对多关系中指定连接表的信息。
  // subject: Subject[]：定义一个类型为 Subject 数组的属性，用于存储与该用户关联的科目信息。
  @JoinTable()
  subject: Subject[]

  @OneToMany(() => Note, note => note.user)
  note: Note[]

  @OneToMany(() => Todolist, todolist => todolist.user)
  todolist: Todolist[]
}
